── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)library(tidyr)tabla_produccion<-read_excel(path="Crude_oil_production_in_OPEC_and_Price_Average_Annual_DoC (2).xlsx", range ="A3:BM18")tabla_canasta <-read_excel(path="cesta_opep.xlsx", range="A3:AP15")#formato largo canasta# Transformar la tabla y renombrar columnas en españoltabla_canasta_long <- tabla_canasta %>%rename(paises = Contries) %>%pivot_longer(cols =-paises, names_to ="Ano", values_to ="Tipo_Petroleo" )###eliminamos las columnas innecesarias####tabla_produccion_corregida<-tabla_produccion%>%select(-(2:21), -(63:65))####transformamos de wide a longer donde damos######un nuevo nombre a las columnas y organizamos por year###tabla_produccion_largo<-tabla_produccion_corregida%>%pivot_longer(cols =-Contries,names_to ="ano",values_to ="produccion_pais" )%>%rename(paises=Contries)%>%arrange(ano)### en este caso vamos a filtrar unas filas, transformarlas a wide###### donde tomaremos los tittulos de la columna "paises" y los valores###### de la columna "produccion", luego con ! eliminaremos esas filas y vamos###### a unir con nuestras nuevas columnas con left_join y lo haremos por orden de year###filas_a_transformar1 <- tabla_produccion_corregida %>%filter(Contries %in%c("OPEC","Price OPEP","Price Average Annual"))filas_transformada_long <- filas_a_transformar1 %>%pivot_longer(cols =-Contries, names_to ="year",values_to ="value")filas_long<-filas_transformada_long%>%pivot_wider(names_from = Contries,values_from = value )# Transformar las filas usando pivot_wider# Transformar la tabla a formato largo y crear la columna produccion_paisproduccion_final <- tabla_produccion_largo %>%filter(!paises %in%c("OPEC", "Price OPEP", "Price Average Annual")) %>%left_join(filas_long, by =c("ano"="year")) %>%rename(produccion_opep = OPEC)# Renombrar las columnas# Convertir las columnas a formato numérico# Convertir las columnas a formato numérico#Convertir las columnas a formato numéricoproduccion_final <- produccion_final %>%mutate(ano =as.numeric(ano),`Price Average Annual`=round(as.numeric(`Price Average Annual`), 1) ) library(tidyverse)library(ggplot2)#Convertir la columna "ano" a tipo numéricotabla_canasta_long <- tabla_canasta_long %>%mutate(Ano =as.numeric(Ano)) # Unir los dataframes "produccion_final" y "tabla_canasta_long" usando left_joinproduccion_final_unida <- produccion_final %>%left_join(tabla_canasta_long, by =c("paises"="paises", "ano"="Ano"))####se creo una columna de porcentaje en la tabla df produccion_final_unidaproduccion_final_unida <- produccion_final_unida %>%mutate(porcentaje_produccion = (produccion_pais / produccion_opep) *100,2)produccion_final_unida <- produccion_final_unida %>%mutate(porcentaje_produccion =round((produccion_pais / produccion_opep) *100, 2))produccion_final_unida <- produccion_final_unida %>%select(-`2`)# resumen estadistico produccion_final_unida %>%select(produccion_opep, `Price OPEP`, `Price Average Annual`)
# Producción promedio por país ###reframe no sumarise ya lo dijo en diciembre 86produccion_final_unida %>%group_by(paises) %>%reframe(produccion_promedio_paises =mean(produccion_pais) ) %>%arrange(desc(produccion_promedio_paises))
#Precios promedios por añoprecios_anuales <- produccion_final_unida %>%group_by(ano) %>%reframe(precio_opep =mean(`Price OPEP`, na.rm =TRUE),precio_global =mean(`Price Average Annual`, na.rm =TRUE) ) %>%ungroup() # Desagrupar después de la operación
A continuación desglosaremos el informe de la construcción del codigo en 2 partes.
Primera parte: Data Frame. (Importar, Ordenar, Transformar).
Segunda parte: (Mapa, Grafícos y Tablas).
En el primer paso con el comando ‘library()’ corrimos los paquetes ‘tidyverse’, ‘dplyr’, ‘readxl, ’tidyr’.
dplyr: Con este codigo activamos las funciones para organizar las filas por columnas, selecionar las columnas, ordenar datos, agraparlos y crear nuevas variables.
tidyverse: Es con conjunto de paquetes de R que integran otros como ‘ggplot2’ (para graficas datos) , ‘readr’ (para visualizar datos), ‘tidyr’ (para organizar datos).
Carga de Datos. (Importación)
library(dplyr)library(tidyverse)library(readxl)library(tidyr)# Importar datos de producción petrolera #tabla_produccion<-read_excel(path="Crude_oil_production_in_OPEC_and_Price_Average_Annual_DoC (2).xlsx", range ="A3:BM18")# Importar datos de tipos de petroleo por país #tabla_canasta <-read_excel(path="cesta_opep.xlsx", range="A3:AP15")
En esta primera parte importamos los datos desde el excell descargado de la pagina de la OPEP, donde teniamos la producción por pais de la OPEP y producción total de todos los países miembros. esta parte del codigo aplicamos ‘readxl’ para importar Excel, ‘range’ para definir celdas específicas.
Transformación inicial de Datos. (Ordenar)
# formato largo canasta ## Transformar la tabla y renombrar columnas en españoltabla_canasta_long <- tabla_canasta %>%rename(paises = Contries) %>%pivot_longer(cols =-paises, names_to ="Ano", values_to ="Tipo_Petroleo" )
Convertir datos de formato ancho (‘wide’) a largo (‘long’) usado ’tidyr: :pivot_longer() para poder trabajar y representar los datos en los graficos de manera correcta.
Limpieza y Reestructuración de Datos de Producción. (Transformar)
# Eliminamos las columnas innecesarias #tabla_produccion_corregida<-tabla_produccion%>%select(-(2:21), -(63:65))#Transformamos de wide a longer donde damos##Un nuevo nombre a las columnas y organizamos por year#tabla_produccion_largo<-tabla_produccion_corregida%>%pivot_longer(cols =-Contries,names_to ="ano",values_to ="produccion_pais" )%>%rename(paises=Contries)%>%arrange(ano)
Ya con el formato en largo (‘long’) le dimos un nuevo nombre a las columnas y organizamos por años y dimos uso de ‘pivol_longer()’ para crear una columna ‘ano’ y ‘produccion_país’.
Procesamiento de Filas Específicas. (Transformar)
### En este caso vamos a filtrar unas filas, transformarlas a wide###### donde tomaremos los titulos de la columna "paises" y los valores###### de la columna "produccion", luego con ! eliminaremos esas filas y vamos###### a unir con nuestras nuevas columnas con left_join y lo haremos por orden de year###filas_a_transformar1 <- tabla_produccion_corregida %>%filter(Contries %in%c("OPEC","Price OPEP","Price Average Annual"))filas_transformada_long <- filas_a_transformar1 %>%pivot_longer(cols =-Contries, names_to ="year",values_to ="value")filas_long<-filas_transformada_long%>%pivot_wider(names_from = Contries,values_from = value )
Hicimos el procesamiento de filas específicas, filas de precios y producción OPEP y nuevamente transformamos a largo y luego ancho teniendo como resultado. Dataframe filas_longcon columnas ‘year’, ‘OPEC’, ‘Price OPEP’, ‘Price Average Annual’.
Unión de las Datasets. (Transformar)
# Transformar las filas usando pivot_wider# Transformar la tabla a formato largo y crear la columna produccion_paisproduccion_final <- tabla_produccion_largo %>%filter(!paises %in%c("OPEC", "Price OPEP", "Price Average Annual")) %>%left_join(filas_long, by =c("ano"="year")) %>%rename(produccion_opep = OPEC)# Renombrar las columnas# Convertir las columnas a formato numérico# Convertir las columnas a formato numérico#Convertir las columnas a formato numéricoproduccion_final <- produccion_final %>%mutate(ano =as.numeric(ano),`Price Average Annual`=round(as.numeric(`Price Average Annual`), 1) )
Transformamos la tabla a formato largo y creamos la columna produccion_pais, la integramos usando left_join y aseguramos el formato numerico de las columnas con ’mutate().
Calculo de porcentaje. (Transformar)
#Convertir la columna "ano" a tipo numéricotabla_canasta_long <- tabla_canasta_long %>%mutate(Ano =as.numeric(Ano)) # Unir los dataframes "produccion_final" y "tabla_canasta_long" usando left_joinproduccion_final_unida <- produccion_final %>%left_join(tabla_canasta_long, by =c("paises"="paises", "ano"="Ano"))####se creo una columna de porcentaje en la tabla df produccion_final_unidaproduccion_final_unida <- produccion_final_unida %>%mutate(porcentaje_produccion = (produccion_pais / produccion_opep) *100,2)produccion_final_unida <- produccion_final_unida %>%mutate(porcentaje_produccion =round((produccion_pais / produccion_opep) *100, 2))produccion_final_unida <- produccion_final_unida %>%select(-`2`)
Terminamos de convertir la columna ‘ano’ a tipo numerico, unimos la data frame “producción_final” y “tabla_canasta_long” con left_join y por consiguiente creamos una columna de porcentaje en la tabla dataframe ‘produccion_final_unida. Aplicamos la formula de porcentaje en nuestro caso fue ’porcentaje_producción = (produccion_país / produccion_opep) y aplicamos ’round’ para redondear a 2 decimales.
Análisis Estadístico. (Transformar)
# resumen estadistico produccion_final_unida %>%select(produccion_opep, `Price OPEP`, `Price Average Annual`)
# Producción promedio por país ###reframe no sumarise ya lo dijo en diciembre 86produccion_final_unida %>%group_by(paises) %>%reframe(produccion_promedio_paises =mean(produccion_pais) ) %>%arrange(desc(produccion_promedio_paises))
#Precios promedios por añoprecios_anuales <- produccion_final_unida %>%group_by(ano) %>%reframe(precio_opep =mean(`Price OPEP`, na.rm =TRUE),precio_global =mean(`Price Average Annual`, na.rm =TRUE) ) %>%ungroup() # Desagrupar después de la operación
Aplicamos la funcion mean y group_by para sacar el promedio de producción agrupado por país y año.
Parte 2: Mapa, Gráficos y Tabla. (Visualización).
En esta parte de visualización de los datos usamos como paquete principal ‘ggplot’ para el desarrollo de los gráficos, permitiendo crear visualizaciones complejas y personalizadas para reflejar los datos de nuestra dataframe.
##Tendencia de preciosggplot(produccion_final_unida, aes(x = ano)) +# Puntos para Precio OPEPgeom_point(aes(y =`Price OPEP`, color ="Precio OPEP")) +# Puntos para Precio Globalgeom_point(aes(y =`Price Average Annual`, color ="Precio Global")) +# Línea de tendencia para Precio OPEPgeom_smooth(aes(y =`Price OPEP`, color ="Precio OPEP"), method ="loess", se =FALSE) +# Línea de tendencia para Precio Globalgeom_smooth(aes(y =`Price Average Annual`, color ="Precio Global"), method ="loess", se =FALSE) +# Etiquetas y título del gráficolabs(title ="Tendencias de precios petroleros (1980-2020)",x ="Año",y ="Precio (USD)",color ="Tipo de precio" ) +# Tema minimalistatheme_minimal() +# Colores personalizados para las series de datosscale_color_manual(values =c("Precio OPEP"="red", "Precio Global"="blue")) +# Posición de la leyendatheme(legend.position ="bottom")
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
#Producción por país (series temporales)# Crear el gráficoggplot(produccion_final, aes(x = ano, y = produccion_pais, color = paises)) +geom_line(linewidth =1) +labs(title ="Producción petrolera por país (1980-2020)",x ="Año",y ="Producción (1,000 b/d)",color ="País" ) +theme_minimal() +theme(legend.position ="bottom")
# Comparación de Producción Anual por Paísproduccion_final %>%# filter(year == 2020) %>%ggplot(aes(x =reorder(paises, produccion_pais), y = produccion_pais, fill = paises)) +geom_bar(stat ="identity") +coord_flip() +labs(title ="Comparación de producción petrolera por país en 2020",x ="País",y ="Producción (1,000 b/d)" ) +theme_minimal() +theme(legend.position ="none") +facet_wrap(~ano)
# Promedio de Producción por Década produccion_final %>%mutate(decade =floor(ano /10) *10) %>%group_by(decade, paises) %>%reframe(mean_produccion_pais =mean(produccion_pais, na.rm =TRUE)) %>%ggplot(aes(x =factor(decade), y = mean_produccion_pais, fill = paises)) +geom_bar(stat ="identity", position ="dodge") +labs(title ="Promedio de producción petrolera por década (1980-2020)",x ="Década",y ="Producción Promedio (1,000 b/d)",fill ="País" ) +theme_minimal()
library(leaflet)# Crear un dataframe con los países y sus coordenadaspaises_location <-data.frame(countries =c("Algeria", "Congo", "Equatorial Guinea", "Gabon", "IR Iran", "Iraq", "Kuwait", "Libya", "Nigeria", "Saudi Arabia", "United Arab Emirates", "Venezuela"),lat =c(28.0339, -0.2280, 1.6508, -0.8037, 32.4279, 33.2232, 29.3759, 26.3351, 9.0820, 23.8859, 23.4241, 6.4238),lng =c(1.6596, 15.8277, 10.2679, 11.6094, 53.6880, 43.6793, 47.9774, 17.2283, 8.6753, 45.0792, 53.8478, -66.5897),produccion_pais=produccion_final$produccion_pais)mapa_interactivo <-leaflet(paises_location) %>%addTiles() %>%# Agregar capa base de OpenStreetMapaddCircleMarkers(lng =~lng, lat =~lat, # Coordenadas de los paísespopup =~countries, # Mostrar el nombre del país al hacer cliclabel =~countries,color ="yellow", # Color del borde del círculo # Color de relleno del círculofillOpacity =0.8# Mostrar el nombre del país al pasar el cursor )# Mostrar el mapamapa_interactivo
#############library(DT)# Primera tabla: Producción Anual por Paístabla1 <-datatable( produccion_final_unida %>%select(paises, ano, produccion_pais, porcentaje_produccion, Tipo_Petroleo, produccion_opep),options =list(pageLength =10,dom ='Bfrtip', # Agrega botones y filtrosbuttons =c('copy', 'csv', 'excel', 'pdf', 'print'),autoWidth =TRUE,scrollX =TRUE,scrollY ="400px" ),filter ='top',caption ='Producción Anual por País')# Mostrar la tablatabla1
####################### Segunda tabla: Precio Anual OPEP (Eliminando duplicados por año)tabla2.21<-datatable( produccion_final %>%select(ano, `Price OPEP`, `Price Average Annual`) %>%distinct(ano, `Price OPEP`, `Price Average Annual`), # Esto se asegura que por año solo haya un registro únicoextensions =c('Buttons'),options =list(buttons =c('copy', 'csv', 'excel', 'pdf', 'print'),pageLength =10 ),caption ='Precio Anual OPEP')# Mostrar la tablatabla2.21
################Graficos lineales###library(ggplot2)library(patchwork)# Gráfico 1: Producción OPEPgrafico_produccion <-ggplot(produccion_final_unida, aes(x = ano, y = produccion_opep)) +geom_line(color ="blue", linewidth =1) +labs(title ="Producción Anual de la OPEP", x ="Año", y ="Producción (Millones de barriles diarios)") +theme_minimal()# Gráfico 2: Precio Internacionalgrafico_precio <-ggplot(produccion_final_unida, aes(x = ano, y =`Price Average Annual`)) +geom_line(color ="red", size =1) +labs(title ="Precio Internacional del Petróleo (Promedio Anual)", x ="Año", y ="Precio (USD por barril)") +theme_minimal()
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.
##Tendencia de preciosggplot(produccion_final_unida, aes(x = ano)) +# Puntos para Precio OPEPgeom_point(aes(y =`Price OPEP`, color ="Precio OPEP")) +# Puntos para Precio Globalgeom_point(aes(y =`Price Average Annual`, color ="Precio Global")) +# Línea de tendencia para Precio OPEPgeom_smooth(aes(y =`Price OPEP`, color ="Precio OPEP"), method ="loess", se =FALSE) +# Línea de tendencia para Precio Globalgeom_smooth(aes(y =`Price Average Annual`, color ="Precio Global"), method ="loess", se =FALSE) +# Etiquetas y título del gráficolabs(title ="Tendencias de precios petroleros (1980-2020)",x ="Año",y ="Precio (USD)",color ="Tipo de precio" ) +# Tema minimalistatheme_minimal() +# Colores personalizados para las series de datosscale_color_manual(values =c("Precio OPEP"="red", "Precio Global"="blue")) +# Posición de la leyendatheme(legend.position ="bottom")
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'
El objetivo es visualizar y comparar los precios de la OPEP y el promedio global.
Aplicamos ‘geom_point’ para mostrar los precios anuales como los puntos, ’geom_smooth” para añadir líneas de tendencia suaviazadas,
(‘method = ’loes’’), ’scale_color_manual para asignarle colores especifícos a cada serie.
Gráfico de series temporales por país.
#Producción por país (series temporales)# Crear el gráficoggplot(produccion_final, aes(x = ano, y = produccion_pais, color = paises)) +geom_line(linewidth =1) +labs(title ="Producción petrolera por país (1980-2020)",x ="Año",y ="Producción (1,000 b/d)",color ="País" ) +theme_minimal() +theme(legend.position ="bottom")
Objetivo: Visualizar la producción petrolera de cada país a lo largo del tiempo.
Aplicamos las funciones de ‘color = paises’ para asignar colores distintos a cada unos de los países automaticamente.
‘theme(legend.position = ’bottom’)’ para colocarle la leyenda debajo del gráfico para mejor legibilidad.
Gráfico de comparación de producción por País (2020)
# Comparación de Producción Anual por Paísproduccion_final %>%# filter(year == 2020) %>%ggplot(aes(x =reorder(paises, produccion_pais), y = produccion_pais, fill = paises)) +geom_bar(stat ="identity") +coord_flip() +labs(title ="Comparación de producción petrolera por país en 2020",x ="País",y ="Producción (1,000 b/d)" ) +theme_minimal() +theme(legend.position ="none") +facet_wrap(~ano)
Objetivo: Comparar la producción entre países en un año específico usando barras horizonlates.
Aplicamos ‘reorder (paises, produccion_pais)’ para ordenar los países por producción ascendente.
‘coord_flip’ para convertir las barras en horizontales.
’face_wrap(~ano) para crear subgráficos por año.
Gráfico de promedio de producción por décadas.
# Promedio de Producción por Década produccion_final %>%mutate(decade =floor(ano /10) *10) %>%group_by(decade, paises) %>%reframe(mean_produccion_pais =mean(produccion_pais, na.rm =TRUE)) %>%ggplot(aes(x =factor(decade), y = mean_produccion_pais, fill = paises)) +geom_bar(stat ="identity", position ="dodge") +labs(title ="Promedio de producción petrolera por década (1980-2020)",x ="Década",y ="Producción Promedio (1,000 b/d)",fill ="País" ) +theme_minimal()
Objetivo: Visualizar la producción por décadas usando barras.
Aplicamos ‘x = factor(decade)’ para tratar la década como una categoría.
‘position = “dodge”’ Colocamos las barras laado a lado para compararlas.
‘fill = paises’. para asignar los colores.
‘star = “identity”’ para usar los valores directos de ‘y’
Mapa Interactivo.
library(leaflet)# Crear un dataframe con los países y sus coordenadaspaises_location <-data.frame(countries =c("Algeria", "Congo", "Equatorial Guinea", "Gabon", "IR Iran", "Iraq", "Kuwait", "Libya", "Nigeria", "Saudi Arabia", "United Arab Emirates", "Venezuela"),lat =c(28.0339, -0.2280, 1.6508, -0.8037, 32.4279, 33.2232, 29.3759, 26.3351, 9.0820, 23.8859, 23.4241, 6.4238),lng =c(1.6596, 15.8277, 10.2679, 11.6094, 53.6880, 43.6793, 47.9774, 17.2283, 8.6753, 45.0792, 53.8478, -66.5897),produccion_pais=produccion_final$produccion_pais)mapa_interactivo <-leaflet(paises_location) %>%addTiles() %>%# Agregar capa base de OpenStreetMapaddCircleMarkers(lng =~lng, lat =~lat, # Coordenadas de los paísespopup =~countries, # Mostrar el nombre del país al hacer cliclabel =~countries,color ="yellow", # Color del borde del círculo # Color de relleno del círculofillOpacity =0.8# Mostrar el nombre del país al pasar el cursor )# Mostrar el mapamapa_interactivo
Objetivo: Resaltar los países miembros de la OPEP en el mapamundi.
Aplicamos el uso del paquete ‘leaflet’ para crear el mapa interactivo y permitir visualizar datos espaciales, y los marcadoles.
‘addTiles’ para añadir un mapa base.
‘addCirccleMarkers’ con este añadimos marcadoles circulares en coordenadas especificas.
‘popup’ y ‘label’ para mostrar la información (nombre de los países) al interactuar con los marcadoles.
Tabla Interactiva 1.
library(DT)# Primera tabla: Producción Anual por Paístabla1 <-datatable( produccion_final_unida %>%select(paises, ano, produccion_pais, porcentaje_produccion, Tipo_Petroleo, produccion_opep),options =list(pageLength =10,dom ='Bfrtip', # Agrega botones y filtrosbuttons =c('copy', 'csv', 'excel', 'pdf', 'print'),autoWidth =TRUE,scrollX =TRUE,scrollY ="400px" ),filter ='top',caption ='Producción Anual por País')# Mostrar la tablatabla1
Objetivo: Expresar los datos de producción anual por país, porcentaje de producción por país, producción por opep y tipo de petroleo.
Usamos el paquete DT para crear tables HTML interactivas con funciones de búsqueda, ordenamiento y exportación.
‘datatable’ para convertir la dataframe en una tabla interactiva.
‘scrollX’ y scrollY’ para desplazarnos horizontal y verticalmente en la tabla.
Tabla 2.21
# Segunda tabla: Precio Anual OPEP (Eliminando duplicados por año)tabla2.21<-datatable( produccion_final %>%select(ano, `Price OPEP`, `Price Average Annual`) %>%distinct(ano, `Price OPEP`, `Price Average Annual`), # Esto se asegura que por año solo haya un registro únicoextensions =c('Buttons'),options =list(buttons =c('copy', 'csv', 'excel', 'pdf', 'print'),pageLength =10 ),caption ='Precio Anual OPEP')# Mostrar la tablatabla2.21
Objetivo: Expresar los datos recopilados de los precios promedios anuales de la opep e internacionales.
‘datatable’ para convertir la dataframe en una tabla interactiva.
‘distinct’ para eliminar los duplicados de los precios y así poder mostrar un solo año.
Gráficos Lineales Combinados.
#Graficos lineales###library(ggplot2)library(patchwork)# Gráfico 1: Producción OPEPgrafico_produccion <-ggplot(produccion_final_unida, aes(x = ano, y = produccion_opep)) +geom_line(color ="blue", linewidth =1) +labs(title ="Producción Anual de la OPEP", x ="Año", y ="Producción (Millones de barriles diarios)") +theme_minimal()# Gráfico 2: Precio Internacionalgrafico_precio <-ggplot(produccion_final_unida, aes(x = ano, y =`Price Average Annual`)) +geom_line(color ="red", size =1) +labs(title ="Precio Internacional del Petróleo (Promedio Anual)", x ="Año", y ="Precio (USD por barril)") +theme_minimal()# Enlazar ambos gráficos (Stacked)grafico_final <- grafico_produccion / grafico_precio# Mostrar gráficosgrafico_final
Objetivo: Relacionar produccion de la OPEP y los precios internacionales.
Para hacer Packet usamos. ‘patchwork’ para enlazar los graficos.
Le colocamos los colores a las gráficas con ‘geom_line’.